package cl.pelu.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;



import cl.pelu.model.bo.dvo.BoletaDVO;
import cl.pelu.model.bo.dvo.ClienteDVO;
import cl.pelu.model.bo.dvo.DetalleDVO;
import cl.pelu.model.bo.dvo.FormulaDVO;
import cl.pelu.model.bo.dvo.ServicioBO;
import cl.pelu.model.bo.dvo.ServicioDVO;
import cl.pelu.model.bo.dvo.TablaDVO;
import cl.pelu.model.bo.dvo.TipoCabelloDVO;

import com.ibatis.sqlmap.client.SqlMapClient;



public class PeluIbatisDaoImpl implements PeluIbatisDao {
	
	
	
	
	SqlMapClient sqlMapClient ;
	
	public void setSqlMapClient(SqlMapClient sqlMapClient)
	{
	  this.sqlMapClient = sqlMapClient;
	}
	
	public SqlMapClient getSqlMapClient()
	{
	  return this.sqlMapClient;
	}
	
	
	
	public List<TablaDVO> getBases() throws SQLException
	{
		return this.sqlMapClient.queryForList("peluqueria.getBases",null);
	}
	
	public List<TablaDVO> getGramos() throws SQLException
	{
		return this.sqlMapClient.queryForList("peluqueria.getGramos",null);
	}
	
	public List<TablaDVO> getOxidante() throws SQLException
	{
		return this.sqlMapClient.queryForList("peluqueria.getOxidante",null);
	}
	
	public List<TablaDVO> getMatiz() throws SQLException
	{
		return this.sqlMapClient.queryForList("peluqueria.getMatiz",null);
	}
	
	public List<TablaDVO> getGramosMatiz() throws SQLException
	{
		return this.sqlMapClient.queryForList("peluqueria.getGramosMatiz",null);
	}

	public List<TablaDVO> getTipoCabello() throws SQLException
	{
		return this.sqlMapClient.queryForList("peluqueria.getTipoCabello",null);
	}
	
	public TablaDVO[] getServicio() throws SQLException
	{
		List lista = this.sqlMapClient.queryForList("peluqueria.getServicio",null);
		
		return (TablaDVO[])lista.toArray(new TablaDVO[lista.size()] );
		
	}
	
	
	public int getPrecioByNombreTipoCabello(String nombreServicio ,  String tipoCabello) throws SQLException
	{
		System.out.println(nombreServicio);
		System.out.println(tipoCabello);
		Map<String, String> mapa = new HashMap<String, String>();
		mapa.put("V_SER_NOMBRE", nombreServicio);
		mapa.put("V_TC_NOMBRE", tipoCabello);
		
		return (Integer)this.sqlMapClient.queryForObject("peluqueria.getPrecioByNombreTipoCabello",mapa);
	}
	
	public void insertBoleta(BoletaDVO boleta) throws SQLException
	{
		this.sqlMapClient.insert("peluqueria.insertBoleta", boleta);
	}

	@Override
	public int insertDetalle(DetalleDVO detalle) throws SQLException {
		return (Integer)this.sqlMapClient.insert("peluqueria.insertDetalle", detalle);
	}

	@Override
	public int insertFormula(FormulaDVO formula) throws SQLException {
		return (Integer)this.sqlMapClient.insert("peluqueria.insertFormula", formula);
	}
	
	public int getIdServicioByNombre(String nombre) throws SQLException{
		return (Integer)this.sqlMapClient.insert("peluqueria.getIdServicioByNombre", nombre);
		
	}
	
	
	public int  getIdUltimaBoleta () throws SQLException{
		
		 Object obj = this.sqlMapClient.queryForObject("peluqueria.getIdUltimaBoleta", null);
		if(obj != null){
			return (Integer)obj;
		}
		
		return (Integer)0;
	}
	
	public BoletaDVO getBoletaById(int id) throws SQLException{
		return (BoletaDVO)this.sqlMapClient.queryForObject("peluqueria.getBoletaById", id);
	}
	
	public DetalleDVO[] getDetalleByBolId(int id) throws SQLException{
		 List<DetalleDVO> lista = this.sqlMapClient.queryForList("peluqueria.getDetalleByBolId", id);
		 
		 DetalleDVO[] dt  = new DetalleDVO[lista.size()];
		 for (int i = 0; i < lista.size(); i++) {
			 dt[i] = (DetalleDVO)lista.get(i);

		}
		 return dt;
		 
	}
	
	public FormulaDVO[] getFormulaByDetId(int id) throws SQLException{
		 List<FormulaDVO> lista = this.sqlMapClient.queryForList("peluqueria.getFormulaByDetId", id);
		 
		 FormulaDVO[] fr = new FormulaDVO[lista.size()];
		 for (int i = 0; i < lista.size(); i++) {
			 fr[i] = (FormulaDVO)lista.get(i);

		}
		 return fr;
		 
	}		

	public void deleteBoletaById(int id) throws SQLException{
		this.sqlMapClient.delete("peluqueria.deleteBoletaById", id);
	}
	
	
	public void deleteDetalleByBolId(int id) throws SQLException{
		this.sqlMapClient.delete("peluqueria.deleteDetalleByBolId", id);
	}

	public void deleteFormulaByDetId(int id) throws SQLException{
		this.sqlMapClient.delete("peluqueria.deleteFormulaByDetId", id);
	}

	

	public BoletaDVO[] getBoletaByFechas(Date fechaDesde , Date fechaHasta) throws SQLException
	{
		Map<String, Date> mapa = new HashMap<String, Date>();
		mapa.put("V_FECHA_DESDE", fechaDesde);
		mapa.put("V_FECHA_HASTA", fechaHasta);
	
		BoletaDVO[] bl = null;
	 	
		 
		List lista  = this.sqlMapClient.queryForList("peluqueria.getBoletaByFechas", mapa);
			 
		 bl = new BoletaDVO[lista.size()];
			 for (int i = 0; i < lista.size(); i++) {
				 bl[i] = (BoletaDVO)lista.get(i);
		}
			 return bl;
	}	
	
	
	
	
	
	public ServicioBO[] getServicios(ServicioDVO servicio) throws SQLException
	{
		List<ServicioBO> lista  = this.sqlMapClient.queryForList("peluqueria.getServicios", servicio);
		return (ServicioBO[])lista.toArray(new ServicioBO[lista.size()] );
		
	}

	
	@Override
	public int insertServicio(ServicioDVO servicio) throws SQLException {
		return (Integer)this.sqlMapClient.insert("peluqueria.insertServicio", servicio);
	}

	@Override
	public ServicioDVO getServiciosByNombre(String nombre) throws SQLException {
		return (ServicioDVO )  this.sqlMapClient.queryForObject("peluqueria.getServiciosByNombre", nombre);
	}
	
	@Override
	public ServicioDVO getServicioById(int id) throws SQLException {
		return (ServicioDVO )  this.sqlMapClient.queryForObject("peluqueria.getServicioById", id);
	}

	@Override
	public void updateServicio(ServicioDVO servicio) throws SQLException {
		this.sqlMapClient.update("peluqueria.updateServicio", servicio);	
	}
	
	@Override
	public void deleteServicioById(int id) throws SQLException {
		this.sqlMapClient.update("peluqueria.deleteServicioById", id);	
	}
	
	
	
	@Override
	public TipoCabelloDVO[] getTipoCabelloByNombre(String nombre) throws SQLException {
		
		List<TablaDVO> lista = this.sqlMapClient.queryForList("peluqueria.getTipoCabelloByNombre", nombre);
		
		TipoCabelloDVO[] tipoCabello=new TipoCabelloDVO[lista.size()];
		
		int i= 0;
		for (TablaDVO tablaDVO2 : lista) {
			TipoCabelloDVO tc = new TipoCabelloDVO(); 
			tc.setId(tablaDVO2.getIdentificador());
			tc.setNombre(tablaDVO2.getNombre());
			tipoCabello[i]=tc;
			i=++i;
		}
	    
		return tipoCabello;
		
		
		
	}
	
	
	public int getPrecioByNombre(String nombre) throws SQLException {
		
		return (Integer)this.sqlMapClient.queryForObject("peluqueria.getPrecioByNombre", nombre);
}
	
	public int isFormulaByNombre(String nombre) throws SQLException{
		
		return (Integer)this.sqlMapClient.queryForObject("peluqueria.isFormulaByNombre", nombre); 
		
	}
	
	
	public int isFormulaByNombreTipoCabello(String nombreServicio ,  String tipoCabello) throws SQLException
	{
		System.out.println(nombreServicio);
		System.out.println(tipoCabello);
		Map<String, String> mapa = new HashMap<String, String>();
		mapa.put("V_SER_NOMBRE", nombreServicio);
		mapa.put("V_TC_NOMBRE", tipoCabello);
		
		return (Integer)this.sqlMapClient.queryForObject("peluqueria.isFormulaByNombreTipoCabello",mapa);
	}
	
	
	
	public int getIdServicioByNombreTipoCabello(String nombreServicio ,  String tipoCabello) throws SQLException
	{
		System.out.println(nombreServicio);
		System.out.println(tipoCabello);
		Map<String, String> mapa = new HashMap<String, String>();
		mapa.put("V_SER_NOMBRE", nombreServicio);
		mapa.put("V_TC_NOMBRE", tipoCabello);
		
		return (Integer)this.sqlMapClient.queryForObject("peluqueria.getIdServicioByNombreTipoCabello",mapa);
	}
	
	public TablaDVO[] getServicioAgrupado() throws SQLException
	{
		List lista = this.sqlMapClient.queryForList("peluqueria.getServicioAgrupado",null);
		
		return (TablaDVO[])lista.toArray(new TablaDVO[lista.size()] );
		
	}
	
	public TablaDVO getBaseById(int id) throws SQLException
	{
		return (TablaDVO) this.sqlMapClient.queryForObject("peluqueria.getBaseById", id);
	}
	
	public TablaDVO getGramosById(int id) throws SQLException
	{
		return (TablaDVO)this.sqlMapClient.queryForObject("peluqueria.getGramosById",id);
		
	}
	
	public TablaDVO getMatizById(int id) throws SQLException
	{
		return (TablaDVO)this.sqlMapClient.queryForObject("peluqueria.getMatizById",id);
		
	}
	
	public TablaDVO getOxidanteById(int id) throws SQLException
	{
		return (TablaDVO)this.sqlMapClient.queryForObject("peluqueria.getOxidanteById",id);
		
	}
	
	public TablaDVO getGramosMatizById(int id) throws SQLException
	{
		return (TablaDVO)this.sqlMapClient.queryForObject("peluqueria.getGramosMatizById",id);
		
	}		
	
	public TablaDVO getTipoCabelloById(int id) throws SQLException
	{
		return (TablaDVO)this.sqlMapClient.queryForObject("peluqueria.getTipoCabelloById",id);
		
	}
	
	

	public ArrayList <ClienteDVO> getClientes(ClienteDVO cliente) throws SQLException
	{
		Map<String, String> mapa = new HashMap<String, String>();
		mapa.put("V_CLI_RUT", cliente.getRut());
		mapa.put("V_CLI_NOMBRE", cliente.getNombre());
		
		return (ArrayList)this.sqlMapClient.queryForList("peluqueria.getClientes",mapa);
	}

	public ClienteDVO getClientesByRut(String rut) throws SQLException
	{
		return (ClienteDVO)this.sqlMapClient.queryForObject("peluqueria.getClienteById",rut);
	}
	
	
	public void eliminarClientesByRut(String rut) throws SQLException
	{
		this.sqlMapClient.delete("peluqueria.deleteClienteById",rut);
	}
	
		
		public void updateClienteByRut(ClienteDVO cliente) throws SQLException
		{
			Map<String, String> mapa = new HashMap<String, String>();
			mapa.put("V_CLI_RUT", cliente.getRut());
			mapa.put("V_CLI_NOMBRE", cliente.getNombre());
			mapa.put("V_CLI_DIRECCION", cliente.getDireccion());
			mapa.put("V_CLI_TELEFONO", cliente.getTelefono());
			mapa.put("V_CLI_CORREO", cliente.getCorreo());
			
			this.sqlMapClient.update("peluqueria.updateClienteByRut",mapa);
		}
		
		public int insertCliente(ClienteDVO cliente) throws SQLException
		{
			Map<String, String> mapa = new HashMap<String, String>();
			mapa.put("V_CLI_RUT", cliente.getRut());
			mapa.put("V_CLI_NOMBRE", cliente.getNombre());
			mapa.put("V_CLI_DIRECCION", cliente.getDireccion());
			mapa.put("V_CLI_TELEFONO", cliente.getTelefono());
			mapa.put("V_CLI_CORREO", cliente.getCorreo());
			
			
			this.sqlMapClient.insert("peluqueria.insertCliente",mapa);
			return 1;
		}
		
		
		public void updateBoleta(BoletaDVO boleta) throws SQLException
		{	
			this.sqlMapClient.update("peluqueria.updateBoleta",boleta);
		}

		@Override
		public BoletaDVO[] getBoletaByCliente(String rut) throws SQLException {
			BoletaDVO[] bl = null;
		 	List lista  = this.sqlMapClient.queryForList("peluqueria.getBoletaByCliente", rut);
				 
			 bl = new BoletaDVO[lista.size()];
				 for (int i = 0; i < lista.size(); i++) {
					 bl[i] = (BoletaDVO)lista.get(i);
			}
				 return bl;
		}

}	